// 生成文件_thread.h的注释：
/*
 * @file     :generate_file_thread.h
 * @brief    :用于生成文件的类，支持读取模型信息、数据信息并生成文件。
 * @details  :该类通过读取模型文件和数据文件中的内容，根据指定路径生成相应的文件。支持线程创建和文件生成功能，并提供多种信号以供调用者处理。
 *
 * @author   :TangMJ
 * @date     :2024-09-17
 */
#ifndef _GENERATE_FILE_THREAD_H_
#define _GENERATE_FILE_THREAD_H_

#include <QObject>
#include <QStringList>
#include <QVector>

#include "model_info.h"
#include "student_info.h"

class generate_file : public QObject {
    Q_OBJECT

public:
    /**
     * @brief 构造函数
     *
     * 初始化生成文件对象。
     *
     * @param parent 父对象指针（默认值为 nullptr）
     * @param is_ignore 是否忽略错误（默认值为 false）
     */
    explicit generate_file(QObject *parent = nullptr, bool is_ignore = false);

    /**
     * @brief 析构函数
     *
     * 释放生成文件类的资源。
     */
    ~generate_file() override;

private:
    /**
     * @brief 静态常量：模型文件中替换姓名的标记
     */
    static const QString REPLACE_NAME_FLAG;          // 模型文件中替换姓名的标记

    /**
     * @brief 静态常量：模型文件中替换分数的标记
     */
    static const QString REPLACE_SCORE_FLAG;         // 模型文件中替换分数的标记

    /**
     * @brief 静态常量：学生数据文件中检查格式的正则表达式
     */
    static const QString REPLACE_CHECK_DATA_REGEXP;  // 学生数据文件中检查格式的正则表达式

    /**
     * @brief 静态常量：学生数据文件中捕获分数的正则表达式
     */
    static const QString REPLACE_CATCH_NUM_REGEXP;   // 学生数据文件中捕获分数的正则表达式

    /**
     * @brief 是否忽略错误
     */
    bool _is_ignore;  // 是否忽略错误

public:
    /**
     * @brief 读取模型文件
     *
     * 从指定路径读取模型文件，并构建模型信息对象。
     *
     * @param model_file_path 模型文件的路径
     * @return 返回读取的模型信息指针
     */
    model_info *_read_model_file(const QString &model_file_path);

    /**
     * @brief 读取数据文件
     *
     * 从指定路径读取数据文件，并构建学生信息数组。
     *
     * @param data_file_path 数据文件的路径
     * @return 返回读取的学生信息数组指针
     */
    QVector<student_info> *_read_data_file(const QString &data_file_path);

    /**
     * @brief 生成文件
     *
     * 根据模型和学生数据生成对应的文件。
     *
     * @param model 模型信息指针
     * @param data 学生信息数组指针
     * @param gen_dir 生成文件的目录
     */
    void _generate_file(const model_info *model, const QVector<student_info> *data, const QString &gen_dir);

public slots:
    /**
     * @brief 开始生成文件
     *
     * 根据提供的模型文件路径、数据文件路径和生成目录开始文件生成过程。
     *
     * @param model_file_path 模型文件路径
     * @param data_file_path 数据文件路径
     * @param gen_dir 生成目录
     */
    void start_generate_file(const QString &model_file_path, const QString &data_file_path, const QString &gen_dir);

    /**
     * @brief 开始重新生成文件（如果有修改）
     *
     * 根据提供的模型文件路径、数据文件路径和生成目录开始文件生成过程。
     *
     * @param model_file_path 模型文件路径
     * @param data_file_path 数据文件路径
     * @param gen_dir 生成目录
     * @param is_ignore 是否忽略错误（默认值为 false）
     */
    void start_re_generate_file(const QString &model_file_path,
                                const QString &data_file_path,
                                const QString &gen_dir,
                                bool is_ignore);

signals:
    /**
     * @brief 文件生成结束信号
     */
    void finish();

    /**
     * @brief 文件打开错误信号
     *
     * 当无法打开指定文件时触发。
     *
     * @param file_path 打开失败的文件路径
     */
    void file_open_error(const QString &file_path);

    /**
     * @brief 文件路径为空信号
     */
    void file_path_empty();

    /**
     * @brief 发送进度信号
     *
     * 当生成过程有进度变化时触发。
     *
     * @param precent 进度百分比
     */
    void send_precent(int precent);

    /**
     * @brief 发送消息信号
     *
     * 当需要发送消息时触发。
     *
     * @param message 消息内容
     */
    void send_message(QString message);

    /**
     * @brief 发送询问是否忽略错误的信号
     *
     * 当遇到错误时，调用者可以选择是否忽略该错误。
     *
     * @param error_num 错误编号或描述
     */
    void send_ask_ignore(QString error_num);
};

#endif